﻿using System;
using System.Configuration;

namespace Library
{
    public class ExceptionTranslator
    {
        public static string Translate(string exceptionMessage)
        {
            try
            {
                
                #region NHibernate
                if (exceptionMessage.StartsWith("could not execute query"))
                    return "Sorgu çalıştırılamadı. " + GetPart(exceptionMessage, "[", "]");
                if (exceptionMessage.StartsWith("Not all named parameters have been set"))
                    return "Tüm sorgu parametreleri gönderilmedi. " + GetPart(exceptionMessage, "[", "]");
                if (exceptionMessage.StartsWith("not-null property references a null or transient value:") && exceptionMessage.Contains("."))
                    return exceptionMessage.Substring(exceptionMessage.LastIndexOf(".") + 1) + " bilgisini giriniz.";
                #endregion

                string databaseType = ConfigurationManager.AppSettings["DatabaseType"];                
                if (String.IsNullOrEmpty(databaseType))
                    return exceptionMessage;

                #region Oracle
                if (databaseType == "ORACLE")
                {                    
                    if (exceptionMessage.StartsWith("could not insert:"))
                        return "Kayıt eklenemedi. " + GetPart(exceptionMessage, "[", "]");
                    if (exceptionMessage.StartsWith("could not delete:"))
                        return "Kayıt silinemedi. " + GetPart(exceptionMessage, "[", "]");
                    if (exceptionMessage.StartsWith("ORA-00001:"))
                        return "Mükerrerlik kuralı ihlal edildi. " + GetPart(exceptionMessage, "(", ")");
                    if (exceptionMessage.StartsWith("ORA-00020:"))
                        return "Veritabanı sunucu maksimum işlem sayısı aşıldı.";
                    if (exceptionMessage.StartsWith("ORA-00600:"))
                        return "Veritabanı iç hatası oluştu.";
                    if (exceptionMessage.StartsWith("ORA-00903:"))
                        return "Hatalı tablo adı.";
                    if (exceptionMessage.StartsWith("ORA-00904:"))
                        return "Hatalı sütun adı ile karşılaşıldı.";
                    if (exceptionMessage.StartsWith("ORA-00936:"))
                        return "Hatalı sorgu cümle yapısı ile karşılaşıldı.";
                    if (exceptionMessage.StartsWith("ORA-00942:"))
                        return "Tablo veya görüntü mevcut değil.";
                    if (exceptionMessage.StartsWith("ORA-01000:"))
                        return "Maksimum işaretçi sayısı aşıldı.";                                         
                    if (exceptionMessage.StartsWith("ORA-01017:"))
                        return "Veritabanı sunucusuna bağlanılamadı. Hatalı kullanıcı adı veya şifre.";
                    if (exceptionMessage.StartsWith("ORA-01031:"))
                        return "Bu işlem için veritabanı yetkiniz bulunmamaktadır.";
                    if (exceptionMessage.StartsWith("ORA-01033:"))
                        return "Veritabanı açılış veya kapanış işleminde olduğu için işlem gerçekleştirilemiyor.";
                    if (exceptionMessage.StartsWith("ORA-01034:"))
                        return "Veritabanı şu anda isteğinize cevap veremiyor.";
                    if (exceptionMessage.StartsWith("ORA-01089:"))
                        return "Veritabanı acil kapanma durumunda olduğu için işleminiz gerçekleştirilemiyor.";
                    if (exceptionMessage.StartsWith("ORA-01092:"))
                        return "Veritabanı sunucusu kapandı ve kullanıcı dışa atıldı.";
                    if (exceptionMessage.StartsWith("ORA-01400:"))
                        return exceptionMessage.Split('\"')[5] + " alanına veri girilmelidir.";
                    if (exceptionMessage.StartsWith("ORA-01403:"))
                        return "Veri bulunamadı. SELECT INTO cümlesi sadece veri olduğunda kullanılabilir.";
                    if (exceptionMessage.StartsWith("ORA-01722:"))
                        return "Hatalı sayı ile karşılaşıldı.";
                    if (exceptionMessage.StartsWith("ORA-01756:"))
                        return "SQL cümlesi doğru olarak sonlandırılmadı. Eksik (') işareti.";
                    if (exceptionMessage.StartsWith("ORA-02201:"))
                        return "Sequence kullanımına burada izin verilmez. Sorguyu kontrol ediniz.";                    
                    if (exceptionMessage.StartsWith("ORA-02292:"))
                        return "Bu kayda bağlı kayıtlar olduğundan işlem gerçekleştirilemez. " + GetPart(exceptionMessage, "(", ")");
                    if (exceptionMessage.StartsWith("ORA-03114:"))
                        return "Veritabanına bağlı değilsiniz.";
                    if (exceptionMessage.StartsWith("ORA-04030:"))
                        return "İşlem hafızası yetersiz.";
                    if (exceptionMessage.StartsWith("ORA-04091:"))
                        return "Tablo şu anda değiştirildiğinden tetikleyiciler veya fonksiyonlar tarafından kullanılamaz.";
                    if (exceptionMessage.StartsWith("ORA-12154:"))
                        return "TNS veritabanı bağlantı hatası. TNS adı çözülemedi.";
                    if (exceptionMessage.StartsWith("ORA-12203:"))
                        return "Veritabanı sunucusuna bağlanılamadı. Sunucu adresi hatalı olabilir.";
                    if (exceptionMessage.StartsWith("ORA-12502:"))
                        return "Veritabanı sunucusuna bağlanılamadı. İstemci tarafından CONNECT_DATA parametresi alınamadı.";
                    if (exceptionMessage.StartsWith("ORA-12505:"))
                        return "Veritabanı sunucusuna bağlanılamadı. İstemci tarafından SID parametresi alınamadı.";
                    if (exceptionMessage.StartsWith("ORA-12514:"))
                        return "Veritabanı sunucusuna bağlanılamadı. İstemci tarafından SERVICE_NAME parametresi alınamadı.";
                    if (exceptionMessage.StartsWith("ORA-12541:"))
                        return "Veritabanı sunucusuna bağlanılamadı. TNS dinleyici yok.";
                    if (exceptionMessage.StartsWith("ORA-12545:"))
                        return "Veritabanı sunucusuna bağlanılamadı. Sunucu veya nesne bulunamadı.";
                    if (exceptionMessage.StartsWith("ORA-01722:"))
                        return "Hatalı sayı. Girilen parametre(ler) sayısal olmalıdır.";
                    
                    if (exceptionMessage.StartsWith("ORA-12899:"))
                    {
                        exceptionMessage = exceptionMessage.Replace("actual", "asıl");
                        exceptionMessage = exceptionMessage.Replace("maximum", "maksimum");
                        string girilenKarakterSayisi = GetPart(exceptionMessage, "(asıl: ", ",");
                        string maksimumKarakterSayisi = GetPart(exceptionMessage, " maksimum: ", ")");
                        return exceptionMessage.Split('\"')[5] + " alanına en fazla " + maksimumKarakterSayisi + " karakter girilebilir. Şu anda girilen: " + girilenKarakterSayisi;
                    }


                }
                #endregion

                return exceptionMessage;
            }
            catch (Exception)
            {
                return exceptionMessage;
            }                                    
        }

        private static string GetPart(string exceptionMessage, string startsWith, string endsWith)
        {
            try
            {   
                exceptionMessage = exceptionMessage.Substring(exceptionMessage.IndexOf(startsWith), exceptionMessage.IndexOf(endsWith) - exceptionMessage.IndexOf(startsWith) + 1);
                return exceptionMessage.Replace(startsWith, "").Replace(endsWith, "");
            }
            catch(Exception)
            {
                return "";
            }
        }
    }
}
